![]() |
![]() |
|
Das modale Öffnen hat zur Folge, dass im aufrufenden Formular die Anweisungen, die ShowDialog folgen, so lange nicht ausgeführt werden, bis der modale Dialog geschlossen wird. Mit dem Schließen liefert die modale Form gleichzeitig auch als Resultat den Inhalt seiner Eigenschaft DialogResult beim Aufrufer ab. Jetzt kann die aufrufenden Form das Ergebnis prüfen und, je nachdem, welche Schaltfläche zum Beenden des Dialogs geführt hat, passend reagieren. Das könnte beispielsweise wie folgt aussehen, wenn der Dialog eine OK- und eine Abbrechen-Schaltfläche hat:
Enthält ein modaler Dialog mehr als zwei auszuwertende Schaltflächen, muss ein anderer Weg beschritten werden, um nicht unglücklicherweise mehrfach denselben Dialog zu öffnen. Hier bieten sich zwei Möglichkeiten an. Die erste ist das Zuweisen der Rückgabe an eine Variable vom Typ DialogResult, die in if-Zweigen geprüft wird:
Etwas eleganter ist eine switch-Anweisung, um in den case-Zweigen auf den Rückgabewert zu reagieren:
15.9.4 Die Weitergabe von Resultaten aus einem Dialog
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| class DialogForm : Form { |
| private TextBox txtEingabe; |
| ... |
| public string TextInput { |
| get { |
| return txtEingabe.Text; |
| } |
| } |
| } |
Nun ist es möglich, die Eigenschaft TextInput abzufragen und deren Inhalt beispielsweise in der Titelleiste des aufrufenden Formulars anzuzeigen:
| if(DialogResult.OK == dialogFrm.ShowDialog()) |
| this.Text = dialogFrm.TextInput; |
Etwas aufwändiger wird es, wenn ein modaler Dialog eine Übernehmen-Schaltfläche enthält. Übernehmen-Schaltflächen unterscheiden sich von den anderen Schaltflächen eines Dialogs dadurch, dass das Hauptfenster die im Dialog vorgenommenen Einstellungen übernimmt, das Dialogfenster aber weiterhin geöffnet bleibt. Das erfordert natürlich eine vollkommen andere Vorgehensweise, da mit der Zuweisung an DialogResult ein modaler Dialog geschlossen wird – zumindest solange diese Eigenschaft nicht den Inhalt None hat.
Im folgenden Beispielprogramm hat der modale Dialog neben einer Textbox und den beiden Schaltflächen OK und Abbrechen auch eine Schaltfläche Übernehmen (siehe Abbildung 15.17). Wird auf letztere geklickt, soll sich der Inhalt der Textbox in die Titelleiste des Hauptfensters schreiben. Üblicherweise werden Übernehmen-Schaltflächen nur dann aktiviert, wenn tatsächlich zu verarbeitende Daten vorliegen. Wir müssen daher Code schreiben, der bei jeder Änderung des Textboxinhalts prüft, ob sich dieser vom aktuellen Titelleistentext des Hauptfensters unterscheidet. Darauf muss dann entsprechend reagiert werden. Außerdem soll die Textbox beim Öffnen des Dialogfensters den Titelleistentext anzeigen.

Hier klicken, um das Bild zu vergrößern
Abbildung 15.17 Modaler Dialog mit Schaltfläche »Übernehmen«
Wenden wir uns dem Code des Dialogs zu. Durch Klicken auf Übernehmen wird signalisiert, dass dem Hauptfenster neue Daten bereitgestellt werden. Das Click-Ereignis der Übernehmen-Schaltfläche kann jedoch nur im Dialogfenster behandelt werden. Das Hauptfenster nimmt von den Ereignissen, die im Dialog intern ausgelöst werden, keine Notiz und weiß nicht, wann es Daten verarbeiten kann.
Um das gewünschte Verhalten zu erzielen, muss das Click-Ereignis weitergeleitet werden. Man erreicht das, indem man im Ereignishandler ein weiteres Ereignis ausgelöst. Dieses ist dialogspezifisch und wird auf Klassenebene definiert. Es soll Apply heißen. Das den Dialog aufrufende Fenster kann das dialogspezifische Ereignis Apply an eine eigene Methode binden und in dieser die Daten des Dialogs verarbeiten. Das folgende Codefragment zeigt den dazu erforderlichen Programmcode.
| // ------------------------------------------------------------- |
| // Beispiel: ...\Kapitel 15\ÜbernehmenSchaltfläche |
| // ------------------------------------------------------------- |
| class DialogForm : Form { |
| // Deklaration des Ereignisses "Apply" |
| public event EventHandler Apply; |
| ... |
| private void DialogForm_Load(object sender, EventArgs e) { |
| this.textBox1.Text = this.Owner.Text; |
| } |
| // Ereignishandler der Übernehmen-Schaltfläche |
| private void btnUebernehmen_Click(object sender, EventArgs e) { |
| if(Apply != null){ |
| Apply(this, e); |
| this.btnUebernehmen.Enabled = false; |
| } |
| } |
| public string GetInputText { |
| get { |
| return this.textBox1.Text; |
| } |
| private void textBox1_TextChanged(object sender, EventArgs e) { |
| if (this.textBox1.Text == this.Owner.Text) |
| this.btnUebernehmen.Enabled = false; |
| else |
| this.btnUebernehmen.Enabled = true; |
| } |
| } |
Klickt der Anwender auf die Schaltfläche Übernehmen, wird innerhalb des Ereignishandlers Apply ausgelöst. Da Click vom Typ EventHandler ist und die Übergabe der Referenz auf die Ereignisquelle sowie die Referenz auf ein Objekt des Typs EventArgs verlangt, werden mit
| Apply(this, e); |
auch alle Argumente weitergeleitet.
Nachdem das Ereignis Apply der aufrufenden Form signalisiert hat, dass neue Daten bereitgestellt werden, kann die Übernehmen-Schaltfläche deaktiviert werden. Dazu wird die Eigenschaft Enabled=false gesetzt.
Wie im Abschnitt zuvor beschrieben wurde, müssen wir sicherstellen, dass das Hauptfenster den Inhalt der Textbox, die standardmäßig private deklariert ist, auswerten kann. Wir könnten zwar den Zugriffsmodifizierer auf public setzen, würden dann aber auch das Ändern des Textboxinhalts von außen zulassen. Das zu verhindern ist die Aufgabe der schreibgeschützten Eigenschaft GetInputText.
Ehe wir uns weiter dem Code im Dialog widmen, sehen wir uns zunächst den Code des aufrufenden Hauptfensters an. Dieses enthält nur die Schaltfläche zum Öffnen des modalen Dialogs.
| public partial class Form1 : Form { |
| public Form1() { |
| InitializeComponent(); |
| } |
| private void btnOpenDialog_Click(object sender, EventArgs e) { |
| DialogForm frm = new DialogForm(); |
| frm.Apply += new EventHandler(SetFormText); |
| DialogResult dr = frm.ShowDialog(this); |
| if (dr == DialogResult.OK) |
| this.Text = frm.GetInputText; |
| } |
| // Ereignishandler des Ereignisses Apply |
| private void SetFormText(object sender, EventArgs e) { |
| this.Text = ((DialogForm)sender).GetInputText; |
| } |
| } |
Im Ereignishandler btnOpenDialog_Click wird die Klasse DialogForm instanziiert und das Ereignis Apply des Objekts mit einem Ereignishandler verknüpft. Aufgerufen wird der Dialog mit der parametrisierten Variante von ShowDialog, der die Referenz auf das aufrufende Hauptfenster übergeben wird. Der modale Dialog empfängt die Übergabe und speichert sie automatisch in seiner Eigenschaft Owner. Damit hat der modale Dialog auch jederzeit Zugriff auf die aufrufende Form. Zum Schluss erfolgt noch die Überprüfung, ob der modale Dialog mit OK geschlossen worden ist. In diesem Fall gilt es, den Inhalt der Textbox auszuwerten. Dafür hatten wir in DialogForm die schreibgeschützte Eigenschaft GetInputText implementiert.
Kommen wir noch einmal zurück zur Klassendefinition von DialogForm. Nach dem Öffnen des Dialogs soll die Textbox den Inhalt der Titelleiste des aufrufenden Dialogs enthalten. Hier kommt uns zugute, dass wir beim Aufruf von ShowDialog die Referenz auf den Aufrufer übergeben haben. So können wir im Load-Ereignis über Owner die Titelleiste abfragen und der Text-Eigenschaft der Textbox zuweisen.
Eine Textbox reagiert auf jede Änderung im Eingabefeld und löst das Ereignis TextChanged aus. Wir machen uns das im Dialog zunutze, um die Aktivierung/Deaktivierung der Schaltfläche Übernehmen zu steuern. Entspricht der Inhalt der Textbox exakt der Titelleiste des Hauptfensters, gibt es nichts vom Hauptfenster zu übernehmen, und die Schaltfläche wird mit der Eigenschaft Enabled deaktiviert (Enabled=false). Weicht der Inhalt der Textbox von der Titelleiste ab, ist der Button aktiviert (Enabled=true).
Eigentlich könnten wir mit dem Ergebnis zufrieden sein, denn der Dialog zeigt bereits alle typischen Verhaltensmerkmale. Ein wenig selbstkritisch sollten wir aber dennoch sein, denn es gibt noch ein paar Verbesserungen vorzunehmen. Damit sind die folgenden beiden Punkte gemeint:
| die Fokussierreihenfolge der Steuerelemente |
| Sonderfunktionen der (Enter)- und (ESC)-Tasten |
Wenden wir uns zunächst der Fokussierreihenfolge zu.
Alle fokussierbaren Steuerelemente einer Form können mit der (Tab)-Taste der Reihe nach aktiviert werden. Nach dem Öffnen und Anzeigen eines Formulars sollten zuerst die Steuerelemente aktiviert werden, die eine Eingabe vom Anwender erwarten, anschließend die Schaltflächen. Innerhalb dieser beiden Gruppen ist die Fokussierreihenfolge konventionsgemäß zuerst von links nach rechts, danach von oben nach unten. Das gilt natürlich nicht nur für modale Dialoge, auch alle anderen Forms sollten sich daran halten.
Mit der Eigenschaft TabIndex der Steuerelemente können wir die Fokussierreihenfolge in einer Form vorschreiben. Dabei erhält das Element zuerst den Fokus, dessen TabIndex-Eigenschaft den Wert 0 hat, danach wird das Steuerelement mit dem Wert 1 fokussiert usw. TabIndex wird in der Reihenfolge vergeben, in der die Controls der Form hinzugefügt werden. Sie können die Werte im Eigenschaftsfenster der Steuerelemente auch beliebig den Erfordernissen anpassen.
Wird der Dialog unseres letzten Beispiels geöffnet, sollte sich der Eingabecursor in der Textbox befinden, um dem Anwender die sofortige Eingabe zu ermöglichen. Die Eigenschaft TabIndex dieses Steuerelements hat demnach den Wert 0. In der Aktivierungsreihenfolge schließt sich dann die OK-Schaltfläche an, gefolgt von Abbrechen und Übernehmen. Die Werte von TabIndex sind für die drei Schaltflächen entsprechend 1, 2 und 3.
Bei vielen Forms kommt der (Enter)-Taste (Eingabetaste) eine besondere Bedeutung zu. Ist eine Schaltfläche fokussiert und wird die (Eingabetaste) gedrückt, wird das Click-Ereignis der fokussierten Schaltfläche ausgelöst. Wird die (Enter)-Taste gedrückt, während beispielsweise eine Textbox den Fokus hat, reagieren viele Formulare so, als sei die OK-Schaltfläche angeklickt worden.
Um eine bestimmte Schaltfläche zur Standardschaltfläche eines Formulars zu erklären, veröffentlicht die Klasse Form die Eigenschaft AcceptButton. Wollen wir die OK-Schaltfläche zur Standardschaltfläche unseres modalen Dialogs machen, muss die Anweisung lauten:
| this.AcceptButton = btnOK; |
Ein ähnliches Verhalten zeigen Formulare, wenn die (ESC)-Taste gedrückt wird. Allerdings entspricht das nicht dem Klicken auf die OK-Schaltfläche, sondern ist gleichbedeutend mit dem Klicken auf Abbrechen – das Formular wird geschlossen. Diesmal müssen wir der Eigenschaft CancelButton der Form die Referenz der formeigenen Abbrechen-Schaltfläche bekannt geben:
| this.CancelButton = btnAbbrechen; |
AcceptButton und CancelButton können natürlich auch im Eigenschaftsfenster eingestellt werden.
| << zurück |
|
||||||||||||||
|
||||||||||||||
|
||||||||||||||
|
||||||||||||||
Copyright © Galileo Press 2006
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.